<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>自定义指令</title>
        <!-- 引入Vue -->
        <script type="text/javascript" src="../js/vue.js"></script>
    </head>
    <body>
        <!-- 
            需求1: 定义一个v-big指令,和v-text功能类似,但会把绑定的数据扩大10倍.
            需求2: 定义一个v-fbind指令,和v-bind功能类似,但可以让其所绑定的input元素默认获取焦点.
            自定义指令总结:
                1. 定义语法
                    1.1 局部指令
                        new Vue({
                            directives: {指令名: 配置对象}
                        })
                        或
                        new Vue({
                            directives: {指令名: 回调函数}
                        })
                    1.2 全局指令
                        Vue.directive(指令名: 配置对象)
                        或
                        Vue.directive(指令名: 回调函数)
                2. 配置对象中常用的3个回调:
                    2.1 bind: 指令与元素成功绑定时
                    2.2 inserted: 指令所在元素倍插入页面时
                    2.3 update: 指令所在的模板被重新解析时
                3. 备注
                    3.1 指令定义时不加v-,但使用时要加v-;
                    3.2 指令名如果是多个单词,要使用kebab-case命名方式,不要用camelCase命名.
         -->
        <div id="root">
            <h2>当前n的值是: <span v-text="n"></span></h2>
            <h2>放大10倍后的n值是: <span v-big="n"></span></h2>
            <button @click="n++">点击</button>
            <hr>
            <input type="text" v-fbind:value="n">
        </div>
        <script type="text/javascript">
            Vue.config.productionTip = false    // 阻止Vue在启动时生成生产提示
            // 自定义全局指令
            /*
            Vue.directive('fbind', {
                        // 指令与元素成功绑定时(一上来)
                        bind(element, binding) {
                            element.value = binding.value
                        },
                        // 指令所在元素倍插入页面时
                        inserted(element, binding) {
                            element.focus()
                        },
                        // 指令所在的模板被重新解析时
                        update(element, binding) {
                            element.value = binding.value
                        }
                    })
                    */

            // 创建Vue实例，开端
            new Vue({
                el: '#root', // el用于指定当前Vue实例为哪个容器服务，值通常为css选择器字符串。
                data: {     // data中用于存储数据，数据供el指定的容器去使用
                    n: 1
                },
                directives: {
                    // big函数何时会被调用?
                    // 1. 指令与元素成功绑定时(一上来)
                    // 2. 指令所在模板被重新解析时.
                    big: function(element, binding) {
                        // element为页面元素, binging为绑定的值
                        console.log('big', this)    // 注意:此处的this指的是window
                        element.innerText = binding.value * 10
                    },
                    fbind: {
                        // 指令与元素成功绑定时(一上来)
                        bind(element, binding) {
                            element.value = binding.value
                        },
                        // 指令所在元素倍插入页面时
                        inserted(element, binding) {
                            element.focus()
                        },
                        // 指令所在的模板被重新解析时
                        update(element, binding) {
                            element.value = binding.value
                        }
                    }
                }
            })
        </script>
    </body>
</html>
